/*
 * Alloy Analyzer
 * Copyright (c) 2002 Massachusetts Institute of Technology
 *
 * The Alloy Analyzer is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * The Alloy Analyzer is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with the Alloy Analyzer; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package alloy.ast;

public class Id extends TreeNode {

    /** counter for generating new Ids */
    private static int idCounter = 0;
    
    /** {@link String} name of the identifier */
    final String _name;
    
    public Id(Location location_, String name_) {
        super(location_);
        _name = name_;
    }


    public Id(String name_) {
        super(Location.UNKNOWN);
        _name = name_;
    }

    /**
     * accept an AST visitor
     * @param visitor_ the visitor
     */
    protected void acceptVisitor(ASTVisitor visitor_) {
        visitor_.visit(this);
    }

    /**
     * accept a returning AST visitor
     * @param visitor_ the visitor
     * @return the Object returned by the visitor
     */
    protected Object acceptReturnVisitor(ASTReturnVisitor visitor_) {
        return visitor_.visit(this);
    }

    /**
     * @param obj the object for comparison
     * @return <pre>true</pre> if this id is the same as obj; <pre>false</pre> otherwise
     */
    public boolean equals(Object obj) {
        return ((obj instanceof Id) &&
                (((Id)obj)._name.equals(_name)));
    }

    public int hashCode() {
        return _name.hashCode();
    }
    
    public String getName() {
        return _name;
    }
    
    public String nodeString() {
        return _name;
    }

    public String toString()
    {
        return _name;
    }

    /**
     * generate a new unique Id based on a String
     * @param base_ the base String from which to generate the Id
     * @return the new Id
     */
    public synchronized static Id generateId(String base_) {
        String uniqueIdString = base_ + "_" + idCounter++;
        // prepend a "_" to avoid conflicts, unless
        // base_ already starts with a "%" (dummy types)
        // in which case it is unnecessary
        if (!base_.startsWith("%")) uniqueIdString = "_" + uniqueIdString;
        return new Id(Location.UNKNOWN, uniqueIdString);
    }
}
